package Project.List;

import javax.swing.text.StyledEditorKit;
import java.util.Arrays;

public class MyArrayList {
    private int[] elem; // 定义数组
    private int usedSize; // 有效数据个数
    private static final int intCapacity = 10; // 定义常量数组的初始大小


    // 顺序表的初始化,这里通过构造方法，初始化
    public MyArrayList() {
        this.usedSize = 0;
        this.elem = new int[10];
    }


    // 打印顺序表
    public void  disPlay() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+",");
        }
        System.out.println();

//        System.out.println(Arrays.toString(this.elem));
    }


    // 判断顺序表是否满了
    private boolean isFull() {
        return this.elem.length == this.usedSize;
    }


    // 插入数据,尾插
    public void tailAdd(int data) {
        if(this.isFull()) {
            // 顺序表满了，通过拷贝赋值，扩容2倍
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        // 插入数据
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }


    // pos位置插入数据
    public void add(int pos ,int data) {
        // 1.判断是否需要扩容
        if(this.isFull()){
            // 扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        // 2.判断pos 的位置是否合理
        if(pos < 0 || pos > this.usedSize) {
            return;
        }
        // 3.移动数据位置
        for(int i = this.usedSize-1;i>= pos;i--) {
            this.elem[i+1] = this.elem[i];
        }
        // 4.插入数据
        this.elem[pos] = data;
        this.usedSize++;
    }



    // 查找该顺序表中是否含有该数值
    public boolean contains(int toFind) {
        for (int tmp:this.elem) {
            if(toFind == tmp) {
                return true; // 该数值存在
            }
        }
        return false; // 该数值不存在
    }



    // 查找该数值在顺表中的位置
    public int search(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(toFind == this.elem[i]) {
                return i; // 找到返回下标
            }
        }
        return -1;  // 没有找到
    }



    // 取出顺序表中某个下标位置的数值
    public int getPos(int pos) {
        // 1. 判断该顺序表是否为空
        if(this.usedSize == 0) {
            throw new RuntimeException("顺序表是空的！");
        }
        // 2. 判断该pos 位置是否合理
        if(pos <0 || pos >= this.usedSize) {
            throw new RuntimeException("pos位置不合法");
        } else {
            return this.elem[pos]; // 返回对应下标的数值
        }

    }



    // 删除顺序表中的某个数值
   public void remove(int toRemove) {
        //1. 判断该数值是否存在
        int index = this.search(toRemove);
        if(index == -1) {
            System.out.println("该数值不存在,无法删除");
            return;
        }
        // 2.移动数据，实现覆盖删除
        for(int i = index;i<this.usedSize-1;i++) {
            this.elem[i] = this.elem[i+1];
        }
        this.usedSize--;
   }



   // 删除某下标 pos 的数值
   public void Delete(int pos) {
        // 1. 判断该下标是否合理
       if(pos < 0 || pos >= this.usedSize) {
           System.out.println("该下标不合理");
           return;
       } else {
           // 下标合理，覆盖实现删除
           for (int i = pos; i < this.usedSize-1; i++) {
               this.elem[i] = this.elem[i+1];
           }
           this.usedSize--;
       }

   }



   // 更新数值,在所在下标，更新数值
    public void setPos(int pos,int value) {
        // 判断该下标是否合理
        if(pos < 0 || pos >= this.usedSize) {
            throw new RuntimeException("pos 位置不合法");
        }
        // 合理更新
        this.elem[pos] = value;
    }


    // 清除顺序表
    public void clear() {
        // 直接将顺序表中的有效数据记录置为 0 ; 即可
        this.usedSize = 0;
        System.out.println("清空成功");
    }
}
